#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
// g++ -pthread thread_9.cpp -o thread_9
// CPU 执行指令： 读取指令、读取内存、执行指令、写回内存

// 保证线程安全：
   // volatile关键字（不行）
          // 保证内存变量的可见性
          // 禁止代码优化(重排序)
   // 原子操作(原子类型)
   // 线程同步(锁)

int aa = 0; // 定义全局变量
mutex mtx;  // 创建互斥锁，保护共享资源aa对象

// 普通函数，把全局变量aa加1000000次
void func() {
    for(int i = 1; i <= 1000000; i++){
      // cout << "线程" << this_thread::get_id() << "申请加锁.....\n";
      lock_guard<mutex> mlock(mtx);  // 代替lock 和 unlock
      // mtx.lock();  // 申请加锁
      // cout << "线程" << this_thread::get_id() << "加锁成功.\n";
      aa++;
      // this_thread::sleep_for(chrono::seconds(5));  // 休眠5s
      // mtx.unlock();  // 解锁
      // cout << "线程" << this_thread::get_id() << "释放了锁.\n";
      // this_thread::sleep_for(chrono::seconds(1));  // 休眠1s
    }
}

int main()
{
    // func();
    // func();
    // 用普通函数创建线程
    thread t1(func);  // 创建线程t1，把全局变量aa加1000000次
    thread t2(func);  // 创建线程t2，把全局变量aa加1000000次

    t1.join();  // 回收线程t1的资源
    t2.join();  // 回收线程t2的资源

    cout << "aa=" << aa << endl;  // 显示全局变量aa的值
}